package client

import (
	. "npxy-go/pkg/proxy/message"
	"npxy-go/pkg/tcp"
)

type localHandler struct {
	tcp.BaseHandler
	sessions      *SessionChannelManager
	id            int32
	bridgeSession *tcp.Session
}

func newLocalHandler(sessions *SessionChannelManager, id int32, bridgeSession *tcp.Session) *localHandler {
	return &localHandler{
		sessions:      sessions,
		id:            id,
		bridgeSession: bridgeSession,
	}
}

func (l *localHandler) OnMessage(_ *tcp.SessionContext, buf *tcp.Buffer) {
	msg := &ForwardMessage{}
	msg.Id = l.id
	msg.Encode(buf)

	l.sendToBridge(buf)
}

func (l *localHandler) OnConnected(ctx *tcp.SessionContext) {
	if ch := l.sessions.GetSessionChan(l.id); ch != nil {
		l.sessions.PutSession(l.id, ctx.Session)
		ch <- ctx.Session
	}
	buf := tcp.NewBuffer()

	msg := ConnectionMessage{}
	msg.Id = l.id
	msg.Encode(buf)

	l.sendToBridge(buf)
}

func (l *localHandler) OnDisconnected(_ *tcp.SessionContext) {
	buf := tcp.NewBuffer()

	msg := DisconnectionMessage{}
	msg.Id = l.id
	msg.Encode(buf)

	l.sendToBridge(buf)
}

func (l *localHandler) sendToBridge(buf *tcp.Buffer) {
	if l.bridgeSession != nil {
		l.bridgeSession.Send(buf)
	}
}
